<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JS函数和对象</title>
</head>
<body>
    <script>
        // 函数创建，形参列表不用写形参类型，也不用写返回值类型，可以返回，也可以不返回
        // 函数调用和创建顺序没要求
        // function hello() {
        //     console.log('hello');
        // }
        // // 函数调用
        // hello();

        // 由于不需要写参数类型，因此一个函数可能实现好多功能
        // function add(x, y) {
        //     return x + y;
        // }

        // let result = add(10, 20);
        // console.log(result);

        // result = add('hello', 'world');
        // console.log(result);

        // result = add('hello', 10);
        // console.log(result);

        // 实参个数不一定要和形参个数相同，没被赋值的形参就成了undefined类型，多了的实参就丢掉
        // 这种情况要实现字符串拼接需要另外处理，否则后面可能会跟一堆的0
        // function add(x, y, z, f, g) {
        //     return (x || 0) + (y || 0) + (z || 0) + (f || 0) + (g || 0);
        // }

        // let result = add(10, 20);
        // console.log(result);

        // result = add(10, 20, 30);
        // console.log(result);

        // result = add(10, 20, 30, 40);
        // console.log(result);

        // result = add('hello', 10, 20);
        // console.log(result);

        // 函数可以像变量一样被赋值给另一个变量，也可以作为一个参数，还可以作为另一个函数的返回值
        // 即函数和变量没有什么区别，只是多了一些功能
        // function hello() {
        //     console.log('hello');
        // }
        // // 函数赋值，此时f就是一个function类型的变量
        // let f = hello;
        // // 打印变量类型
        // // console.log(typeof f);
        // f();

        // 第二种赋值方法
        // let f = function hello() {
        //     console.log('hello');
        // }

        // 第三种赋值方法，定义一个匿名函数/lambda表达式，然后把这个函数赋值给f
        // let f = function () {
        //     console.log('hello');
        // }
        
        // JS支持函数嵌套和调用，而函数内部的变量会逐层往上找，直到找到num变量或者找不到报错
        // let num = 10;
        // function hello() {
        //     let num = 20;
        //     function hello2() {
        //         console.log(num);
        //     }
        //     hello2();
        // }
        // hello();





        // 对象，属性和方法的集合，JS中使用{}创建对象
        // 对象中每个属性和方法都是通过键值对的形式表达的
        // 键值对之间用','分割，键和值之间用':'分割
        // 最常用的创建对象的方式
        // let student = { 
        //     id:10,
        //     name:'学生',
        //     height:180,

        //     sing:function() {
        //         console.log('只因你太美');
        //     },

        //     jump:function() {
        //         console.log('跳');
        //     }
        // }

        // // 属性调用
        // console.log(student.id);
        // // 方法调用
        // student.sing();

        // 通过new Object()的方式来定义一个对象，之后再添加属性和方法
        // 使用 { } 创建的对象也可以随时使用 student.name = "学生"; 这样的方式来新增属性
        // let student = new Object();
        // student.id = 10;
        // student.name = '学生';
        // student.sing  = function{
        //     console.log('只因你太美');
        // }

        // 通过构造函数创建一组相似的对象，需要用到this属性
        function student(id, name) {
            this.id = id;
            this.name = name;
        }
        let a = new student(5, '张三');
        let b = new student(10, '李四');
        console.log(a.id);
        console.log(b.name);

    </script>


</body>
</html>